#include "depthvideowidget.h"
#include <QMouseEvent>
#include <QPainter>
#include <QToolTip>
#pragma execution_character_set("utf-8")
DepthVideoWidget::DepthVideoWidget(QWidget *parent)
    : QWidget{parent}
{
    // 设置背景为深色（与深度图灰度显示更协调）
    //setBackgroundRole(QPalette::Dark);
    setAutoFillBackground(true);
    // 启用鼠标追踪（无需按下鼠标即可触发mouseMoveEvent）
    setMouseTracking(true);
}

DepthVideoWidget::~DepthVideoWidget()
{
}

void DepthVideoWidget::setFrame(const QImage& frame)
{
    QMutexLocker locker(&m_mutex); // 线程安全：防止绘制时数据被修改
    // 将QImage转换为QPixmap（高效绘制），保持原图比例
    m_currentFrame = QPixmap::fromImage(frame);
    update(); // 触发重绘
}

void DepthVideoWidget::clearFrame()
{
    QMutexLocker locker(&m_mutex);
    m_currentFrame = QPixmap(); // 清空当前帧
    m_depthData.clear();        // 清空深度数据
    update(); // 触发重绘（显示"视频已停止"）
}

void DepthVideoWidget::setDepthData(const QVector<quint16>& dapthData, int width, int height)
{
    QMutexLocker locker(&m_mutex); // 线程安全：防止读取时数据被修改
    m_depthData = dapthData;
    m_depthWidth = width;
    m_depthHeight = height;
}

void DepthVideoWidget::mouseMoveEvent(QMouseEvent* event)
{
    QMutexLocker locker(&m_mutex); // 锁定共享数据
    m_lastPos = event->pos(); // 记录当前鼠标位置

    // 检查是否有有效图像和深度数据
    if (m_currentFrame.isNull() || m_depthData.isEmpty() || m_depthWidth <= 0 || m_depthHeight <= 0) {
        QToolTip::hideText();
        return;
    }

    // 1. 计算图像显示区域（用于坐标转换）
    QSize frameSize = m_currentFrame.size();
    QSize widgetSize = size();
    QSize scaledSize = frameSize.scaled(widgetSize, Qt::KeepAspectRatio);
    QRect displayRect(
        (widgetSize.width() - scaledSize.width()) / 2,
        (widgetSize.height() - scaledSize.height()) / 2,
        scaledSize.width(),
        scaledSize.height()
    );

    // 2. 检查鼠标是否在图像显示区域内
    if (!displayRect.contains(m_lastPos)) {
        QToolTip::hideText();
        return;
    }

    // 3. 将鼠标坐标转换为图像原始像素坐标（反缩放）
    // 计算缩放比例（图像原始尺寸 / 显示尺寸）
    double scaleX = static_cast<double>(m_depthWidth) / scaledSize.width();
    double scaleY = static_cast<double>(m_depthHeight) / scaledSize.height();
    // 鼠标在图像显示区域内的相对坐标
    int mouseXInDisplay = m_lastPos.x() - displayRect.left();
    int mouseYInDisplay = m_lastPos.y() - displayRect.top();
    // 转换为原始图像的像素坐标（四舍五入）
    int imageX = qRound(mouseXInDisplay * scaleX);
    int imageY = qRound(mouseYInDisplay * scaleY);

    // 4. 边界检查（防止数组越界）
    if (imageX < 0 || imageX >= m_depthWidth || imageY < 0 || imageY >= m_depthHeight) {
        QToolTip::hideText();
        return;
    }

    // 5. 获取对应像素的深度值（单位：毫米）
    int index = imageY * m_depthWidth + imageX; // 行优先索引
    if (index < 0 || index >= m_depthData.size()) {
        QToolTip::hideText();
        return;
    }
    quint16 depthMM = m_depthData[index];

    // 6. 显示工具提示（包含坐标和深度值，转换为米）
    QString tip = QString(tr("坐标: (%1, %2)\n深度: %3 mm (%4 m)"))
        .arg(imageX).arg(imageY)
        .arg(depthMM).arg(depthMM / 1000.0, 0, 'f', 3); // 保留3位小数
    QToolTip::showText(mapToGlobal(m_lastPos), tip, this);

    // 7. 发射信号（可选：供其他控件显示深度值）
    //emit depthValueChanged(imageX, imageY, depthMM);

    // 触发重绘（更新鼠标十字标记位置）
    update();
#if 0
    m_lastPos = event->pos();
    if (m_depthData.isEmpty() || m_currentFrame.isNull())
        return;
    QSize frameSize = m_currentFrame.size();
    QRect displayRect(
        (width() - frameSize.width()) / 2,
        (height() - frameSize.height()) / 2,
        frameSize.width(),
        frameSize.height()
    );
    if (!displayRect.contains(m_lastPos)) {
        return;
    }
    // 将鼠标坐标转换为深度图坐标
    QPointF normalizedPos(
        (m_lastPos.x() - displayRect.left()) / static_cast<float>(displayRect.width()),
        (m_lastPos.y() - displayRect.top()) / static_cast<float>(displayRect.height())
    );

    int depthX = qRound(normalizedPos.x() * (m_depthWidth - 1));
    int depthY = qRound(normalizedPos.y() * (m_depthHeight - 1));

    // 边界检查
    if (depthX >= 0 && depthX < m_depthWidth && depthY >= 0 && depthY < m_depthHeight) {
        // 获取深度值（单位：毫米）
        quint16 depthValue = m_depthData[depthY * m_depthWidth + depthX];
        setToolTip(QString("坐标: (%1, %2)  深度: %3 毫米 (%4 米)")
            .arg(depthX).arg(depthY).arg(depthValue).arg(depthValue / 1000.0));
        qDebug() << "depthX" << depthX << "depthY" << depthY << "depthValue" << depthValue;
    }
    else {
        setToolTip("");
    }

    update(); // 触发重绘以显示鼠标位置
#endif
}

void DepthVideoWidget::leaveEvent(QEvent* event)
{
    Q_UNUSED(event);
    QToolTip::hideText(); // 鼠标离开时隐藏提示
}

void DepthVideoWidget::paintEvent(QPaintEvent* event) 
{
#if 1
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::SmoothPixmapTransform);

    QMutexLocker locker(&m_mutex);
    if (!m_currentFrame.isNull() && m_currentFrame.width() > 0 && m_currentFrame.height() > 0) {
        QSize frameSize = m_currentFrame.size();
        QSize widgetSize = size();
        QSize scaledSize = frameSize.scaled(widgetSize, Qt::KeepAspectRatio);

        QRect displayRect(
            (widgetSize.width() - scaledSize.width()) / 2,
            (widgetSize.height() - scaledSize.height()) / 2,
            scaledSize.width(),
            scaledSize.height()
        );

        // 调试：打印显示区域和鼠标位置
        //qDebug() << "displayRect:" << displayRect;
        //qDebug() << "m_lastPos:" << m_lastPos;

        painter.drawPixmap(displayRect, m_currentFrame);

        // 严格判断鼠标是否在图像显示区域内
        /*bool isMouseInImage = (m_lastPos.x() >= displayRect.left() && m_lastPos.x() <= displayRect.right() &&
            m_lastPos.y() >= displayRect.top() && m_lastPos.y() <= displayRect.bottom());

        if (!m_depthData.isEmpty() && isMouseInImage) {
            QPoint imagePos = m_lastPos - displayRect.topLeft();
            painter.setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap));
            painter.drawLine(imagePos.x() - 5, imagePos.y(), imagePos.x() + 5, imagePos.y());
            painter.drawLine(imagePos.x(), imagePos.y() - 5, imagePos.x(), imagePos.y() + 5);
        }*/
    }
    else {
        painter.setPen(Qt::white);
        painter.drawText(rect(), Qt::AlignCenter, "视频已停止");
    }
#else
    Q_UNUSED(event);
    QPainter painter(this);
    painter.setRenderHint(QPainter::SmoothPixmapTransform); // 图像缩放平滑

    QMutexLocker locker(&m_mutex); // 锁定共享数据
    if (!m_currentFrame.isNull()) {
        // 1. 计算图像居中显示的位置（保持宽高比）
        QSize frameSize = m_currentFrame.size();
        QSize widgetSize = size();
        // 缩放图像以适应控件，不拉伸
        QSize scaledSize = frameSize.scaled(widgetSize, Qt::KeepAspectRatio);
        // 居中显示的矩形区域
        QRect displayRect(
            (widgetSize.width() - scaledSize.width()) / 2,
            (widgetSize.height() - scaledSize.height()) / 2,
            scaledSize.width(),
            scaledSize.height()
        );

        // 2. 绘制图像
        painter.drawPixmap(displayRect, m_currentFrame);

        // 3. 绘制鼠标十字标记（如果鼠标在图像区域内）
        if (!m_depthData.isEmpty() && displayRect.contains(m_lastPos)) {
            // 计算鼠标在图像内的相对坐标（用于绘制十字）
            QPoint imagePos = m_lastPos - displayRect.topLeft();
            // 绘制红色十字（线条长度5像素，线宽1像素）
            painter.setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap));
            painter.drawLine(imagePos.x() - 5, imagePos.y(), imagePos.x() + 5, imagePos.y()); // 水平线
            painter.drawLine(imagePos.x(), imagePos.y() - 5, imagePos.x(), imagePos.y() + 5); // 垂直线
        }
    }
    else {
        // 无图像时显示提示文本
        painter.setPen(Qt::white); // 白色文字（与深色背景对比）
        painter.drawText(rect(), Qt::AlignCenter, "视频已停止");
    }
#endif
   

}